[XEN][POWERPC] Print DAR and DSISR registers on CPU register dumps
authorJimi Xenidis <jimix@watson.ibm.com>
Sun, 21 Jan 2007 00:05:18 +0000 (19:05 -0500)
committerJimi Xenidis <jimix@watson.ibm.com>
Sun, 21 Jan 2007 00:05:18 +0000 (19:05 -0500)
The information from these register can really help track doen
problems.  They are only saved on program exception, so we show what
in the CPU at time of printing as well.

Signed-off-by: Jimi Xenidis <jimix@watson.ibm.com>
--HG--
extra : transplant_source : %B4%B7%24%9F%00%D6%062%86%D8%D7%24%0FCA%E0%8B%D2%EE%91

xen/arch/powerpc/backtrace.c
xen/arch/powerpc/powerpc64/asm-offsets.c
xen/arch/powerpc/powerpc64/exceptions.S
xen/arch/powerpc/powerpc64/traps.c
xen/include/public/arch-powerpc.h

index 3615d08fe4cb47ce32ce5cebb46cb79664a9b412..30e4ffde2ed6b9579179b36dc4d3b2b02eb9aac2 100644 (file)
@@ -198,7 +198,6 @@ void show_backtrace_regs(struct cpu_user_regs *regs)
     console_start_sync();
     
     show_registers(regs);
-    printk("dar 0x%016lx, dsisr 0x%08x\n", mfdar(), mfdsisr());
     printk("hid4 0x%016lx\n", regs->hid4);
     printk("---[ backtrace ]---\n");
     show_backtrace(regs->gprs[1], regs->lr, regs->pc);
index 60fa4c631c872bc99dbe016dc9f181ae8c73f289..5c6f2aa5306197cc420b5290bdf435f0cd3f1867 100644 (file)
@@ -48,6 +48,8 @@ void __dummy__(void)
     OFFSET(UREGS_ctr, struct cpu_user_regs, ctr);
     OFFSET(UREGS_xer, struct cpu_user_regs, xer);
     OFFSET(UREGS_hid4, struct cpu_user_regs, hid4);
+    OFFSET(UREGS_dar, struct cpu_user_regs, dar);
+    OFFSET(UREGS_dsisr, struct cpu_user_regs, dsisr);
     OFFSET(UREGS_cr, struct cpu_user_regs, cr);
     OFFSET(UREGS_fpscr, struct cpu_user_regs, fpscr);
     DEFINE(UREGS_sizeof, sizeof(struct cpu_user_regs));
index 08b99b784535264f3644e08f9b136a43d6f6c691..07e7217b6dc2fe59d3f0f8c06fa1436d12450a7b 100644 (file)
@@ -373,9 +373,15 @@ ex_machcheck_continued:
  * a better way, but this works for now. */
 ex_program_continued:
     SAVE_GPRS r14, r31, r1              /* save all the non-volatiles */
-    /* save hid4 for debug */
+
+    /* save these for debug, no needed for restore */
     mfspr r14, SPRN_HID4
     std r14, UREGS_hid4(r1)
+    mfdar r14
+    std r14, UREGS_dar(r1)
+    mfdsisr r14
+    stw r14, UREGS_dsisr(r1)
+
     mr r14, r0
     EXCEPTION_SAVE_STATE r1
     mr r4, r14
index de29215d0693bde6cd2ccbda6cf8bf05c8c490e3..21411ef39bb84b873033b6923fedf6b118a2612b 100644 (file)
@@ -41,7 +41,15 @@ void show_registers(struct cpu_user_regs *regs)
            regs->pc, regs->msr,
            regs->lr, regs->ctr,
            regs->srr0, regs->srr1);
-    for (i=0; i<32; i+=4) {
+
+    /* These come in handy for debugging but are not always saved, so
+     * what is "actually" in the register should be good */
+    printk("dar %016lx dsisr %08x *** saved\n"
+           "dar %016lx dsisr %08x *** actual\n",
+           regs->dar, regs->dsisr,
+           mfdar(), mfdsisr());
+
+    for (i = 0; i < 32; i += 4) {
         printk("r%02i: %016lx %016lx %016lx %016lx\n", i,
             regs->gprs[i], regs->gprs[i+1], regs->gprs[i+2], regs->gprs[i+3]);
     }
index 9acb749e16e631cca476844f283f0a9978a47338..9ef33c502c67d46264dc6403f33a49d478bcd8d2 100644 (file)
@@ -77,8 +77,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_pfn_t);
 
 typedef uint64_t xen_ulong_t;
 
-/* User-accessible registers: need to be saved/restored for every nested Xen
- * invocation. */
+/* User-accessible registers: nost of these need to be saved/restored
+ * for every nested Xen invocation. */
 struct cpu_user_regs
 {
     uint64_t gprs[32];
@@ -88,10 +88,13 @@ struct cpu_user_regs
     uint64_t srr1;
     uint64_t pc;
     uint64_t msr;
-    uint64_t fpscr;
+    uint64_t fpscr;             /* XXX Is this necessary */
     uint64_t xer;
-    uint64_t hid4;
+    uint64_t hid4;              /* debug only */
+    uint64_t dar;               /* debug only */
+    uint32_t dsisr;             /* debug only */
     uint32_t cr;
+    uint32_t __pad;             /* good spot for another 32bit reg */
     uint32_t entry_vector;
 };
 typedef struct cpu_user_regs cpu_user_regs_t;